﻿/**
 * 粘帖事件处理插件
 * Opera貌似怎么都绑定不上粘帖事件，所以也就不能处理粘帖数据
 */
(function(E, $){
var Consts = E.consts,
	Event = E.mod('Event'),
	Selection = E.mod('Selection'),
	Utils = E.mod('Utils'),
	timer = {},
	browser = $.browser,
	beforePasteLength = 0,
	isCtrlV = false,
	afterPasteLength = 0;
	
E.plugin("PasteToText", {
	click: function(Panel, self, target){
		if( !browser.webkit && !browser.mozilla && !browser.msie ){
			return true;
		}
		var button = target ? target.closest('.jqe-button') : $("PasteToText"),
			option = E.get('option');
			
		if( option.PasteToText ){
			option.PasteToText = false;
			button.removeClass("jqe-button-checked");
			E.showNotice('关闭纯文本粘帖模式');
		}else{
			option.PasteToText = true;
			button.addClass("jqe-button-checked");
			E.showNotice('粘帖内容到编辑器将自动转为纯文本', 3000);
		}
	}
});

// 此方法貌似仅对IE好使
// firefox chrome 都么有测试通过
function paste( dom ){
	isCtrlV = true;
	E.pasteHTML('<span class="jqe-paste-wrap"> </span>');
	$("#jqe-paste-text").val('').focus();
	
	setTimeout(function(){
		var wrap = E.$('.jqe-paste-wrap'),
			range = null,
			text = $("#jqe-paste-text").val();
		if( browser.msie ){
			range = dom.body.createTextRange();
			range.moveToElementText(wrap[0]);
			range.collapse(true);
			range.select();
		}
		text = Utils.escape(text);
		text = text.replace(/\r/g, "");
		text = text.replace(/\n/g, '<br>\n');
		wrap.before( text ).remove();
		wrap = null;
	}, 0);
	setTimeout(function(){
		E.monitor('PasteToText');
	},50);
}

if( Consts.IE ){
	Event.bind('keydown', function(dom, e){
		var eid = E.eid,
			option = E.get('option');
		if( option.PasteToText && e.ctrlKey && e.keyCode == 86 ){
			// ctrl + v
			paste(dom);
		}
	});
}

Event.bind('paste', function(dom, e){
	var eid = E.eid,
		option = E.get('option');
	
	if(option.PasteToText){
		// 2011-08-18 潘雪鹏
		// 这个纯文本粘帖模式的处理方法不太理想
		// 期待更好的解决方法
		
		if( browser.webkit ){
			// 2011-08-17 21:21 潘雪鹏
			// 这个方式在IE和FF下不可用，
			// textarea在IE和FF下的编辑器里面，不是可直接编辑的，
			// 在IE下双击后可编辑，
			// 在FF下直接就不能编辑。
			// 即便是暂时更改，
			// Consts.IE ? dom.body.contentEditable = 'false' : dom.designMode = 'Off';
			// 也行不通。
			
			E.pasteHTML('<textarea class="jqe-paste-wrap"></textarea>');
			$('.jqe-paste-wrap', dom).focus();
			setTimeout(function(){
				var input = E.$('.jqe-paste-wrap'),
					text = input.val();
				text = Utils.escape(text);
				
				text = text.replace(/\r/g, "");
				text = text.replace(/\n/g, '<br>\n');
				input.before( text ).remove();
			}, 0);
			
			e.shiftKey = true;
			setTimeout(function(){
				E.monitor('PasteToText');
			},50);
			
		}else if( browser.mozilla ){
			E.pasteHTML('<div class="jqe-paste-wrap"><a class="jqe-paste-text"></a></div>');
			var el = E.$('.jqe-paste-text')[0];
			var range = Selection.getRange();
			range.selectNode(el);
			
			setTimeout(function(){
				var wrap = E.$('.jqe-paste-wrap'),
					text = wrap.text(),
					node = dom.createTextNode('');
				text = Utils.escape(text);
				text = text.replace(/\n/g, '<br>\n');
				//wrap.replaceWith( text );
				wrap.before(node);
				wrap.remove();
				wrap = null;
				E.$(node).before(text).remove();
			}, 0);
			setTimeout(function(){
				E.monitor('PasteToText');
			},50);
			
		}else if( browser.msie ){
			if( !isCtrlV ){
				var text = window.clipboardData.getData("text");
				if ( text ) {
					//text = Utils.filter65279(text);
					text = Utils.escape(text);
					text = text.replace(/\n/g, '<br>\n');
					E.pasteHTML(text);
				}
				
				setTimeout(function(){
					E.monitor('PasteToText');
				},50);
				return false;
			}
			isCtrlV = false;
		}else{
			Cleanup(function(){
				E.monitor('PasteToText');
			});
		}
	}else if(option.AutoCleanup){
		if( typeof option.AutoCleanup !== 'number' ){
			option.AutoCleanup = 500;
		}else if( option.AutoCleanup < 100 ){
			option.AutoCleanup = 100;
		}
		
	// 最好可以判断一下，在粘帖的内容比较多的时候才自动进行清理操作
	// 如果仅是粘帖了几个字就不要再自动过滤
		beforePasteLength = E.getHTML(false).length;
		Cleanup(function(){
			E.monitor('PasteToText');
		});
	}else{
		var eid = E.eid;
		clearTimeout( timer[eid] );
		timer[eid] = setTimeout(function(){
			E.monitor('Paste');
		}, 200);
	}
	E.log("run", "执行粘帖事件");
});

// 执行代码清理工作
function Cleanup( callback ){
	var eid = E.eid, option = E.get('option');
	clearTimeout( timer[eid] );
	timer[eid] = setTimeout(function(){
		afterPasteLength = E.getHTML(false).length;
		if(afterPasteLength - beforePasteLength > option.AutoCleanup){
			var plugin = E.plugin('Cleanup');
			plugin.click(callback);
		}
	}, 500);
}
})(jQEditor, jQuery);